package com.yupi.springbootinit.manager;

import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * Redis 限流器
 */
@Service
public class RedisLimiterManager {

    private static final Logger log = LoggerFactory.getLogger(RedisLimiterManager.class);

    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流操作
     *
     * @param key 区分不同的限流器，比如不同的用户 id 应该分别统计
     * @return true 表示通过限流，false 表示被限流
     */
    public void doRateLimit(String key) {

            // 创建一个限流器
            RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
            // 每秒最多访问 2 次
            // 参数1 type：限流类型，可以是集群限流也可以单机限流
            // 参数2 rate：限流速率
            // 参数3 rateInterval：限流时间间隔
            // 参数4 unit：时间单位
            rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
            // 每当一个操作来了后，请求一个令牌
            boolean canPass = rateLimiter.tryAcquire(1);
            if (!canPass) {
                log.error("请求被限流了");
                throw new RuntimeException("请求被限流了");
            }



    }
}